FF = require("SharedLibs/FP/Function");
Core = require("SharedLibs/Core");

_REFLECTION = true;

local m = {}

--[[
	创建一个ptototype类型
	一个prototype类似一个class.
	proto定义的类型也可以被class定义的类型inherit. 当然proto定义的类型是没有inherit能力的

	优点: 效率高(没有metatable, 没有index)
	缺点: 
	1. 如果类型方法特别多, 因为所有方法都要copy一次, 有可能会有轻微的性能影响.
	但是从设计上看, 这种类型本身是设计错误.
	2. 所有静态方法也会被复制一个引用.
]]
function m.proto(name, noReg)
	local protoCls = {};
	--name = name or _ENV.script.Name;
	local info = debug.getinfo(2, "S")
	name = name or (info and info.source:match("[^/\\]*$"):gsub("%.lua$", "")) or "UnnamedClass";
	protoCls.__name = name;

	protoCls.new = function(...)
		local obj = {};
		obj.__proto = protoCls;

		FF.extends(obj, protoCls);
		local cons = obj.constructor;
		if cons then
			cons(obj, ...);
		end

		return obj;
	end

	if not noReg then
		if _REFLECTION then Core.RegisterClass(protoCls) end;
	end

	return protoCls;
end

return m;
